static SDL_Surface * mapa_base = NULL;
static SDL_Surface * tela = NULL;
static SDL_Surface * tiles[18] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
static SDL_Surface * fundo = NULL;
static Bool_t iniciado = FALSE;
static unsigned int anima_pos = 0;

extern struct Anima * gato;
extern struct Anima * cozinheiro;

Bool_t gfx_feche = FALSE;


SDL_Thread * gfx_thread = NULL;//isso é para ficar no main ou no eventos, e talvez como static

void gfx_prepare(){
	if(iniciado == TRUE){
		return;
	}
	SDL_WM_SetCaption("Eater Thief",NULL);
	SDL_WM_SetIcon(IMG_Load("./icone.png"),NULL);
#	ifdef SAFE_MODE
		tela = SDL_SetVideoMode(800,640,32,SDL_SWSURFACE);
#	elif defined RELEASE
		tela = SDL_SetVideoMode(800,640,32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_ASYNCBLIT|SDL_FULLSCREEN);
#	else
		tela = SDL_SetVideoMode(800,640,32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_ASYNCBLIT);
#	endif
	if(tela == NULL){
#		ifdef DEBUG
			fprintf(stderr,"Falhou ao inicalizar tela usando memória da placa de vídeo.\n"
			               "Erro: %s.\nTentando modo software.\n",tmp=SDL_GetError());
			free(tmp);
#		endif
		tela = SDL_SetVideoMode(800,640,32,SDL_SWSURFACE);
		if(tela == NULL){
			fprintf(stderr,"Falhou ao inicializar vídeo no modo software\n"
			               "Erro: %s.",SDL_GetError());
			return 1;
		}
	}
	unsigned short int i = 0;
	for(i = 0;i < 18;++i){
		if(tiles[i] == NULL){
			switch(i){
				case 0:
					tiles[0] = IMG_Load("./gfx/0000.png");
					break;
				case 1:
					tiles[1] = IMG_Load("./gfx/0001.png");
					break;
				case 2:
					tiles[2] = IMG_Load("./gfx/0010.png");
					break;
				case 3:
					tiles[3] = IMG_Load("./gfx/0011.png");
					break;
				case 4:
					tiles[4] = IMG_Load("./gfx/0100.png");
					break;
				case 5:
					tiles[5] = IMG_Load("./gfx/0101.png");
					break;
				case 6:
					tiles[6] = IMG_Load("./gfx/0110.png");
					break;
				case 7:
					tiles[7] = IMG_Load("./gfx/0111.png");
					break;
				case 8:
					tiles[8] = IMG_Load("./gfx/1000.png");
					break;
				case 9:
					tiles[9] = IMG_Load("./gfx/1001.png");
					break;
				case 0xa:
					tiles[10] = IMG_Load("./gfx/1010.png");
					break;
				case 0xb:
					tiles[11] = IMG_Load("./gfx/1011.png");
					break;
				case 0xc:
					tiles[12] = IMG_Load("./gfx/1100.png");
					break;
				case 0xd:
					tiles[13] = IMG_Load("./gfx/1101.png");
					break;
				case 0xe:
					tiles[14] = IMG_Load("./gfx/1110.png");
					break;
				case 0xf:
					tiles[15] = IMG_Load("./gfx/1111.png");
					break;
				case 0x10:
					tiles[16] = IMG_Load("./gfx/peixe.png");
					break;
				case 0x11:
					tiles[17] = IMG_Load("./gfx/gato_do_ic.png");
					break;
				case 0x12:
					tiles[18] = IMG_Load("./gfx/cozinheiro");
			}
		}
		if(tiles[i] == NULL){
#			ifdef DEBUG
				fprintf(stderr,"Falha ao abrir arquivo.\nErro: %s.\n",SDL_GetError());
#			endif
			exit(EXIT_FAILURE);
		}
	}
	fundo = IMG_Load("./gfx/fundo.png");
	if(fundo == NULL){
#		ifdef DEBUG
			fprintf(stderr,"Não foi possível carregar a imagem fundo.png.\nErro: %s.\n",SDL_GetError());
#		endif
		exit(EXIT_FAILURE);
	}
	iniciado = TRUE;
}

inline void por_tile(Tile_t tileid,unsigned int x,unsigned int y,Bool_t totela){
	if(!tileid){
		return;
	}else if(tileid > 18){
		tileid = 19;
	}
	--tileid;
	SDL_Surface * destino = totela ? tela : mapa_base;
	SDL_Rect aux;
	aux.x = x;
	aux.y = y
	aux.w = 32;
	aux.h = 32;
	SDL_BlitSurface(tiles[tileid],NULL,destino,&aux);
}

void gfx_cartografo(){
	SDL_BlitSurface(fundo,NULL,tela,NULL);
	unsigned short int i,j;
	for(j = 0;j < 20;++j){
		for(i = 0;i < 25;++i){
			if((mapa[i][j] > 0)&&(mapa[i][j] < 17)){
				por_tile(mapa[i][j],i*32,j*32,FALSE);
			}
		}
	}
}

int gfx_main(void * gfx_fps){
	Uint32 inicio;
	unsigned int fps = *((unsigned int *)(gfx_fps));
	struct Anima * atual = cozinheiro;
	while(!gfx_feche){
		inicio = SDL_GetTicks();
		SDL_BlitSurface(mapa_base,NULL,tela,NULL);
		for(j = 0;j < 20;++j){
			for(i = 0;i < 25;++i){
				if(mapa[i][j] == 17){
					por_tile(17,i,j,TRUE);
				}
			}
		}
		if(gato != NULL){
			SDL_BlitSurface(18,gato->x,gato->y,TRUE);
		}
		if(atual != NULL){
			while(atual->anterior != NULL){
				atual = atual->anterior;
			}
			while(atual->proximo != NULL){
				SDL_BlitSurface(19,atual->x,atual->y,TRUE);
				atual = atual->proximo;
			}
		}
		SDL_Delay(1000/fps + inicio - SDL_GetTicks());
	}
	gfx_feche = FALSE;
	return 0;
}

void intro(SDL_Surface * const tela){
	register short int i,j;
	Uint32 tempo;
	SDL_Surface *gfxf[21];
	gfxf[0] = IMG_Load("./gfx/fundopreto.png");
	gfxf[1] = IMG_Load("./gfx/intro2.png");
	gfxf[2] = IMG_Load("./gfx/intro3.png");
	gfxf[3] = IMG_Load("./gfx/intro4.png");
	gfxf[4] = IMG_Load("./gfx/intro5.png");
	gfxf[5] = IMG_Load("./gfx/intro6.png");
	gfxf[6] = IMG_Load("./gfx/intro7.png");
	gfxf[7] = IMG_Load("./gfx/intro8.png");
	gfxf[8] = IMG_Load("./gfx/intro9.png");
	gfxf[9] = IMG_Load("./gfx/intro10.png");
	gfxf[10] = IMG_Load("./gfx/intro11.png");
	gfxf[11] = IMG_Load("./gfx/intro12.png");
	gfxf[12] = IMG_Load("./gfx/intro13.png");
	gfxf[13] = IMG_Load("./gfx/intro14.png");
	gfxf[14] = IMG_Load("./gfx/intro15.png");
	gfxf[15] = IMG_Load("./gfx/intro16.png");
	gfxf[16] = IMG_Load("./gfx/intro17.png");
	gfxf[17] = IMG_Load("./gfx/intro18.png");
	gfxf[18] = IMG_Load("./gfx/intro19.png");
	gfxf[19] = IMG_Load("./gfx/intro20.png");
	gfxf[20] = IMG_Load("./gfx/intro.png");
	for(i=0;i<21;++i){
		if(gfxf[i]==NULL){
#ifdef DEBUG
			fprintf(stderr,"Não foi possível carregar intr*png.\nErro: %s.\n",SDL_GetError());
#endif
			exit(EXIT_FAILURE);
		}
	}
	for(i=0;i<20;++i){
		tempo = SDL_GetTicks();
		SDL_BlitSurface(gfxf[i],NULL,tela,NULL);
		SDL_Flip(tela);
		SDL_Delay(100 + tempo - SDL_GetTicks());
	}
	tempo = SDL_GetTicks();
	SDL_BlitSurface(gfxf[20],NULL,tela,NULL);
	SDL_Flip(tela);
	SDL_Delay(500 + tempo - SDL_GetTicks());
	for(i=19;i>=0;--i){
		SDL_BlitSurface(gfxf[i],NULL,tela,NULL);
		SDL_Flip(tela);
		SDL_Delay(50);
	}
	SDL_Delay(50);
	for(i=0;i<21;++i){
		SDL_FreeSurface(gfxf[i]);
	}
	return;
}
